#角标越界异常
def index_error_example(index):
    try:
        my_list = [1, 2, 3]
        ret=my_list[index]  
    except IndexError as e:
        print(f"索引错误: {e}")
        
def key_error_example(key):
    try:
        my_dict = {'a': 1, 'b': 2}
        ret=my_dict[key]  
    except KeyError as e:
        print(f"键错误: {e}")
        # 解释：尝试访问字典中不存在的键时，会抛出KeyError异常。
def value_error_example(value):
    try:
        num = int(value)  # 尝试将字符串转换为整数
    except ValueError as e:
        print(f"值错误: {e}")
        # 解释：尝试将非数字字符串转换为整数时，会抛出ValueError异常。
#自定义异常
class CustomError(Exception):
    def __init__(self, message):
        super().__init__(message)
        self.message = message

def custom_error_example():
    '''  # 主动抛出自定义异常
    1.不能为空
    2.长度必须小于4
    3.不能包含数字
    raise 关键字用于手动抛出（触发）异常。当程序遇到错误或不符合预期的情况时，可以使用 raise 主动中断正常流程，并传递一个特定的异常对象。
    '''
    name=input("请输入姓名：")
    name=name.strip()
    if name == '':  # 如果name为空字符串
        raise CustomError("姓名不能为空")#自定义异常，不符合退出程序
    if len(name) > 4:  # 如果name长度大于4
        raise CustomError("姓名长度必须小于4")
    if any(char.isdigit() for char in name):  # 如果name包含数字
        raise CustomError("姓名不能包含数字")
    return name
   
while True:
    name= custom_error_example()
    print(f"姓名是：{name}")        
   
if __name__ == '__main__':
    index_error_example(5)  # 尝试访问列表中不存在的索引
    key_error_example('c')  # 尝试访问字典中不存在的键
    value_error_example('abc')  # 尝试将非数字字符串转换为整数
    custom_error_example()  # 主动抛出自定义异常     
# 解释：尝试访问列表中不存在的索引时，会抛出IndexError异常。
# 解释：尝试访问字典中不存在的键时，会抛出KeyError异常。
# 解释：尝试将非数字字符串转换为整数时，会抛出ValueError异常。
# 解释：主动抛出自定义异常时，会抛出CustomError异常。